package com.rd.teacher.jichao.day26;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class TestReflect {

    public static void main(String[] args) throws Exception {
        // 通过对象 拿到对应的类
        People people = new People();
        Class cc = people.getClass();

        // 也可以直接通过 .class获取
        Class cc1 = People.class;

        // 还可以通过类的路径 来获取类本身
        Class cc2 = Class.forName("com.zrrd.day26.People");

        System.out.println(cc.getName());
        // 类中的属性 也是一个对象 叫做Field
        // 可以通过getFields()获取对应类的属性 是公开的属性
        Field[] fields = cc1.getFields();
        for (Field field : fields) {
            System.out.println(field.getName());
        }

        System.out.println("----------");
        // 可以通过getDeclaredFields()获取对应类的属性 既包括公有的 又包括私有的
        Field[] fields1 = cc1.getDeclaredFields();
        for (Field field : fields1) {
            System.out.println(field.getName());
        }

        System.out.println("----------");
        // 还可以获取方法
        Method[] methods = cc2.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method.getName());
        }

        System.out.println("----------");
        // 可以通过getField 获取一个公开的属性 如果是私有的 会报错
        Field f1 = cc2.getField("name");
        Field f2 = cc2.getDeclaredField("age");
        System.out.println(f1.getName());
        System.out.println(f2.getName());

        Object p1 = cc2.newInstance();
        f1.set(p1, "Tom");
        System.out.println(f1.get(p1));

        System.out.println("----------");
        Constructor[] constructors = cc2.getConstructors();
        for (Constructor constructor : constructors) {
            System.out.println(constructor);
        }
    }
}
